package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.Category;
import com.itheima.common.PageBean;
import com.itheima.common.R;
import com.itheima.exception.CustomException;
import com.itheima.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RequestMapping("/category")
@RestController
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 新增分类     /category+post
     * @param category
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){
        //1.判断新增分类名称是否已存在
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Category::getName,category.getName());
        Category one = categoryService.getOne(wrapper);
        if(one!=null){
            throw new CustomException("分类名称【"+category.getName()+"】已存在！");
        }

        //2.调用service完成分类新增
        categoryService.save(category);

        //3.返回成功处理结果
        return R.success("新增成功！");
    }

    /**
     * 分类分页查询
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("/page")
    public R<PageBean> page(@RequestParam(defaultValue="1") Integer page, @RequestParam(defaultValue="10") Integer pageSize){
        //1.配置MyBatisPlus分页拦截器【已完成】
        //2.创建Page对象 封装分页查询参数
        Page<Category> categoryPage = new Page<>(page, pageSize);

        //3.调用service完成分页查询
        categoryService.page(categoryPage);

        //4.将当前页数据和总条数封装到PageBean对象返回
        PageBean<Category> pageBean = new PageBean<>(categoryPage.getRecords(), categoryPage.getTotal());
        return R.success(pageBean);
    }

    /**
     * 分类删除  /category + delete
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> deleteById(Long ids){
        //1.调用service完成分类删除
        categoryService.deleteById(ids);

        //2.返回处理结果
        return R.success("删除成功！");
    }

    /**
     * 分类修改  /category + put
     * @param category
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody Category category){
        //1.判断修改后的分类名称是否存在【根据分类名称去查询数据库】
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Category::getName,category.getName());
        wrapper.ne(Category::getId,category.getId());  //不是自己               不要和自己这条记录比较名称是否相同
        Category one = categoryService.getOne(wrapper);
        if(one!=null){
            throw new CustomException("分类名称【"+category.getName()+"】已存在！");
        }

        //2.调用service完成修改
        categoryService.updateById(category);

        //3.返回修改成功
        return R.success("修改成功！");
    }

    /**
     * 查询分类列表数据
     * @param type
     * @return
     */
    @GetMapping("/list")
    public R<List<Category>> list(Integer type){
        //1.调用service根据type查询数据库 得到分类列表数据
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(type!=null,Category::getType,type);
        List<Category> list = categoryService.list(wrapper);

        //2.返回分类列表数据
        return R.success(list);
    }
}
